%{

#include <stdio.h>
#include <stdlib.h>

int yylex();

void yyerror( char *s);

extern FILE *yyin;

%}


%token PROGRAM
%token IDENT
%token ESPACE
%token PVIRG
%token SAUT
%token USES
%token VAR
%token REAL
%token INTEGER
%token BOOLEAN
%token DOUBLE_P
%token VIRG
%token PROCED
%token PAR_OUV
%token PAR_FER
<<<<<<< HEAD
%token BEGIN_K
%token END_K
%option yylineno

=======
>>>>>>> FETCH_HEAD


%%


Progamme:
			NameProg SAUT Decl{printf("Programme\n");};
		;
NameProg: 
				PROGRAM ESPACE IDENT ESPACE PVIRG ESPACE { }
			| PROGRAM ESPACE IDENT PVIRG ESPACE { }
			| PROGRAM ESPACE IDENT PVIRG  { }
			| PROGRAM ESPACE IDENT ESPACE PVIRG  { }
		;

Decl :
		| Uses {}
		| Var {}
<<<<<<< HEAD
		| Uses SAUT Var {}
		| Uses SAUT Proc {}
		| Var SAUT Proc {}
		| Uses SAUT Var DeclFunAndPro {};
=======
		| Uses SAUT Var {printf("Uses SAUT var\n");}
		| Uses SAUT Proc {}
		| Var SAUT Proc {}
		| Uses SAUT Var Proc {printf("Uses SAUT var SAUT Proc\n");};
>>>>>>> FETCH_HEAD
	;
Uses:
			USES DeclUses PVIRG {}
		| USES DeclUses PVIRG ESPACE{};  
		;
		
DeclUses : 
		  ESPACE IDENT ESPACE {}
		| IDENT {}
		| ESPACE IDENT {}
		| IDENT ESPACE {}	
		| DeclUses VIRG DeclUses{}
		;
		
		/*
		Ajout de la declaration des variables 
		*/
Var:
<<<<<<< HEAD
		VAR ESPACE DeclVar {};
DeclVar:
			ListVar DOUBLE_P Type PVIRG{};
		| ListVar DOUBLE_P Type ESPACE PVIRG{}
		| ListVar DOUBLE_P ESPACE Type PVIRG{}
		| ListVar DOUBLE_P ESPACE Type ESPACE PVIRG{}
		| ListVar DOUBLE_P Type PVIRG ESPACE{}
		| ListVar DOUBLE_P Type ESPACE PVIRG ESPACE {}
		| ListVar DOUBLE_P ESPACE Type PVIRG ESPACE{}
		| ListVar DOUBLE_P ESPACE Type ESPACE PVIRG ESPACE {}
		| DeclVar SAUT {}
		| DeclVar SAUT DeclVar {};
=======
		VAR ESPACE DeclVar {printf("VAR \n");};
DeclVar:
			ListVar DOUBLE_P Type PVIRG{printf("1\n");};
		| ListVar DOUBLE_P Type ESPACE PVIRG{printf("2\n");}
		| ListVar DOUBLE_P ESPACE Type PVIRG{printf("3\n");}
		| ListVar DOUBLE_P ESPACE Type ESPACE PVIRG{printf("4\n");}
		| ListVar DOUBLE_P Type PVIRG ESPACE{printf("6\n");};
		| ListVar DOUBLE_P Type ESPACE PVIRG ESPACE {printf("7\n");}
		| ListVar DOUBLE_P ESPACE Type PVIRG ESPACE{printf ("8\n");}
		| ListVar DOUBLE_P ESPACE Type ESPACE PVIRG ESPACE {printf("9\n");}
		| DeclVar SAUT {}
		| DeclVar SAUT DeclVar {printf("DeclVar Saut Decl\n");};
>>>>>>> FETCH_HEAD
		
ListVar : 
		IDENT {}
	| IDENT ESPACE { }
	| ESPACE IDENT { }
	| ESPACE IDENT ESPACE { }
	| ListVar VIRG ListVar { }
	| ListVar VIRG ListVar ESPACE{ }
	| ESPACE ListVar VIRG ListVar { }
	| ESPACE ListVar VIRG ListVar ESPACE{ };
<<<<<<< HEAD
		

	
ListVarFunPro:
	IDENT {}
| IDENT ESPACE { }
| ESPACE IDENT { }
| ESPACE IDENT ESPACE { }
| ListVarFunPro VIRG ListVarFunPro { }
| ListVarFunPro VIRG ListVarFunPro ESPACE{ }
| ESPACE ListVarFunPro VIRG ListVarFunPro { }
| ESPACE ListVarFunPro VIRG ListVarFunPro ESPACE{ };
	;
	
DeclVarFunPro:
	ListVarFunPro DOUBLE_P Type {};
| ListVarFunPro DOUBLE_P Type ESPACE {}
| ListVarFunPro DOUBLE_P ESPACE Type {}
| ListVarFunPro DOUBLE_P ESPACE Type ESPACE {}
| ListVarFunPro DOUBLE_P Type  ESPACE{};
| ListVarFunPro DOUBLE_P Type ESPACE  ESPACE{}
| ListVarFunPro DOUBLE_P ESPACE Type  ESPACE{}
| ListVarFunPro DOUBLE_P ESPACE Type ESPACE  ESPACE {}
| DeclVarFunPro PVIRG DeclVarFunPro {};




Proc :
	 DeclProc{};
	//|DeclProc {printf("balblalala\n");};
DeclProc:
		DeclNomProc SAUT Var StructBE{}
	 |DeclNomProc SAUT StructBE{};		

DeclNomProc:
		 PROCED ESPACE IDENT ESPACE PVIRG {} // Exemple : procedure Test ;
		|PROCED ESPACE IDENT PVIRG {} // Exemple : procedure Test; 
		|PROCED ESPACE IDENT PAR_OUV DeclVarFunPro PAR_FER PVIRG {} // Exemple : procedure Test(Var1:integer);
		|PROCED ESPACE IDENT PAR_OUV DeclVarFunPro PAR_FER ESPACE PVIRG  {} // Exemple : procedure Test(Var1:integer) ;
		|PROCED ESPACE IDENT ESPACE PAR_OUV DeclVarFunPro PAR_FER PVIRG{} // Exemple : procedure Test (Var1:integer);
		|PROCED ESPACE IDENT ESPACE PAR_OUV DeclVarFunPro PAR_FER ESPACE PVIRG{}// Exemple : procedure Test(Var1:integer) ;
		;
		/*
		Definition des types 
		*/
		
DeclFunAndPro :
		Proc {}
			;
			
			
StructBE :
	BEGIN_K SAUT  DeclarBE SAUT END_K {};
		
DeclarBE :
			SAUT{};
=======
>>>>>>> FETCH_HEAD
		

	
ListVarFunPro:
	IDENT {}
| IDENT ESPACE { }
| ESPACE IDENT { }
| ESPACE IDENT ESPACE { }
| ListVarFunPro VIRG ListVarFunPro { }
| ListVarFunPro VIRG ListVarFunPro ESPACE{ }
| ESPACE ListVarFunPro VIRG ListVarFunPro { }
| ESPACE ListVarFunPro VIRG ListVarFunPro ESPACE{ };
	;
	
DeclVarFunPro:
	ListVarFunPro DOUBLE_P Type {printf("\n");};
| ListVarFunPro DOUBLE_P Type ESPACE {printf("2\n");}
| ListVarFunPro DOUBLE_P ESPACE Type {printf("3\n");}
| ListVarFunPro DOUBLE_P ESPACE Type ESPACE {printf("4\n");}
| ListVarFunPro DOUBLE_P Type  ESPACE{printf("6\n");};
| ListVarFunPro DOUBLE_P Type ESPACE  ESPACE {printf("7\n");}
| ListVarFunPro DOUBLE_P ESPACE Type  ESPACE{printf ("8\n");}
| ListVarFunPro DOUBLE_P ESPACE Type ESPACE  ESPACE {printf("9\n");}
| DeclVarFunPro PVIRG DeclVarFunPro {};




Proc :
 
	|DeclProc SAUT Proc{};

DeclProc:
		 PROCED ESPACE IDENT ESPACE PVIRG {} // Exemple : procedure Test ;
		|PROCED ESPACE IDENT PVIRG {} // Exemple : procedure Test; 
		|PROCED ESPACE IDENT PAR_OUV DeclVarFunPro PAR_FER PVIRG {printf("PROCED ESPACE");} // Exemple : procedure Test(Var1:integer);
		|PROCED ESPACE IDENT PAR_OUV DeclVarFunPro PAR_FER ESPACE PVIRG  {printf("PROCED ESPACE");} // Exemple : procedure Test(Var1:integer) ;
		|PROCED ESPACE IDENT ESPACE PAR_OUV DeclVarFunPro PAR_FER PVIRG{printf("PROCED ESPACE");} // Exemple : procedure Test (Var1:integer);
		|PROCED ESPACE IDENT ESPACE PAR_OUV DeclVarFunPro PAR_FER ESPACE PVIRG{printf("PROCED ESPACE");}// Exemple : procedure Test(Var1:integer) ;
		;
		/*
		Definition des types 
		*/
Type :
			REAL {}
		| INTEGER {}
		| BOOLEAN {}
		| DOUBLE_P {}	;
%%

int main (int argc , char** argv)
{
	
	FILE *f = NULL ; 
	if (argc > 1)
	{
		f = fopen(argv[1],"r");
		if (f==NULL)
		{
		return -1;
		}
		yyin = f;
	}
	yyparse();
	
	if (f!=NULL)
		fclose(f);
	
	
}

void yyerror( char* s)
{
  fprintf (stderr, "%s\n", s);
}